Pelajari cara merancang database profesional, menulis query efisien, dan mengintegrasikan dengan Laravel untuk membangun aplikasi web yang scalable.
💡 Gunakan tombol panah atau keyboard untuk navigasi
🎯 By the end of this chapter, kamu akan bisa membangun Product Management System dengan fitur CRUD lengkap, relasi database kompleks, dan upload gambar!
Database adalah tempat penyimpanan data terstruktur. Bayangkan database seperti perpustakaan sekolahmu:
📚
Saat kamu cari buku "Pemrograman Web", perpustakaan tidak cari satu per satu. Ada katalog (INDEX) yang menunjuk langsung ke lokasi buku!
💡 Begitu juga database: gunakan INDEX dan PRIMARY KEY untuk pencarian ultra-cepat!
Kumpulan data dalam format baris dan kolom, seperti spreadsheet Excel.
Satu entitas data. Contoh: 1 siswa = 1 baris di tabel students.
Atribut data. Contoh: nama, email, nomor induk siswa adalah kolom-kolom di tabel students.
Identitas unik setiap baris. Tidak boleh ada 2 siswa dengan ID yang sama!
Penghubung antar tabel. Contoh: kolom course_id di tabel enrollments menunjuk ke tabel courses.
Akselerasi pencarian. Seperti katalog perpustakaan, membuat query 100x lebih cepat!
Perhatikan meja absen di kelas kamu:
Struktur Meja Absen:
Di Database (SQL):
✨ Meja absen fisik = Tabel database digital!
ERD adalah blueprint database — diagram yang menunjukkan tabel dan relasi antar tabel.
Penjelasan: Satu STUDENT bisa ambil banyak COURSE (One-to-Many). Satu COURSE bisa diambil banyak STUDENT (One-to-Many). ENROLLMENT adalah tabel junction (bridge) yang menghubungkan keduanya.
Normalisasi = Proses menghilangkan redundansi data untuk membuat database lebih efisien.
students: id, name, courses (berisi: "Math, Science, English")
🔴 Masalah: Kolom courses menyimpan multiple values (tidak atomik). Sulit dicari dan dimodifikasi.
students: id, name
enrollments: id, student_id, course_id
🟢 Solusi: Pisahkan ke tabel terpisah. Setiap kolom atomic (1 value saja). Lebih fleksibel & cepat.
Rule of Thumb: Jika kamu melihat kolom yang berisi multiple values (dipisah koma atau array), itu tanda untuk split ke tabel baru!
Satu record di tabel A berhubungan dengan SATU record di tabel B, dan sebaliknya.
👤
User
id, username, email
🪪
Profile
id, user_id (FK), bio, avatar
Analogi: Satu orang = satu KTP. Satu KTP hanya milik satu orang.
💡 Catatan: ->unique() pada foreign key memastikan One-to-One (tidak bisa ada 2 profiles untuk 1 user).
Satu record di tabel A berhubungan dengan BANYAK record di tabel B.
🏪
Category
id, name
📦 Product 1
📦 Product 2
📦 Product N
Analogi: Satu rak toko punya banyak produk. Satu kategori "Makanan" punya ratusan produk, tapi setiap produk cuma di 1 kategori.
💡 Di Laravel, gunakan hasMany() untuk relasi One-to-Many!
Banyak record di tabel A berhubungan dengan BANYAK record di tabel B.
👨🎓 Student 1
👨🎓 Student 2
👨🎓 Student N
📚 Course 1
📚 Course 2
📚 Course M
Analogi: Satu siswa bisa ambil banyak course. Satu course bisa diambil banyak siswa. Dibutuhkan tabel "junction" (tabel penengah) untuk menghubungkan keduanya!
✨ Laravel otomatis handle junction table (enrollments) di belakang layar dengan belongsToMany()!
Sebelum membuat tabel, setup koneksi database di file .env
Setelah itu, test koneksi dengan command:
💡 Catatan: Pastikan nama database sudah dibuat di MySQL. Gunakan MySQL Workbench atau phpMyAdmin untuk membuat database baru!
Migration adalah file yang mendefinisikan struktur tabel. Seperti Git untuk database, tapi untuk schema!
File akan dibuat di database/migrations/:
Jalankan migration:
✨ Tabel products akan otomatis terbuat di MySQL!
Analogi: Seeder seperti menanam benih, Factory seperti mesin pemotong yang membuat design seragam sebelum ditanam.
Jalankan dengan: php artisan db:seed --class=ProductSeeder
Eloquent adalah "magic tool" Laravel yang bikin kita menulis query pakai PHP objects, bukan raw SQL!
Analogi kehidupan sehari-hari:
Seperti kamu pergi ke supermarket untuk beli 100 barang, tapi tiap barang harus naik ke mobil dan kembali. 101 perjalanan!
Kamu masukkan semua 100 barang dalam 1 keranjang besar, cuma 2 perjalanan total! Masuk aja sekali bawa semuanya.
| Aspek | ❌ Lazy Loading | ✅ Eager Loading |
|---|---|---|
| Jumlah Query | N + 1 (banyak!) | 1 + 1 = 2 (minimal) |
| Waktu Eksekusi | ~500ms - 5s (lambat) | ~10ms - 100ms (cepat) |
| Beban Database | Tinggi (banyak koneksi) | Rendah (sedikit koneksi) |
| Scalability | Buruk (melambat saat data besar) | Baik (performa stabil) |
| Contoh Kasus | Ambil 100 products, loop akses category | Ambil 100 products + categories sekaligus |
❌ LAZY LOADING (Buruk)
✅ EAGER LOADING (Bagus!)
💡 GOLDEN RULE: Setiap kali akses relasi (->category, ->products, dll), WAJIB pakai ->with() untuk eager load!
Query Builder memudahkan menulis query kompleks tanpa raw SQL:
Flowchart bagaimana request user sampai ke database dan kembali:
| 🔢 Step | Komponen | 🎯 Tugas | 📤 Input | 📥 Output |
|---|---|---|---|---|
| 1 | Browser | User klik link atau submit form | User action (click) | HTTP Request (GET/POST/PUT/DELETE) |
| 2 | Router | Cocokkan URL dengan route yang didefinisikan | Request URL (e.g., /products/1) | Nama Controller & Method |
| 3 | Controller | Jalankan logika bisnis, siapkan data | Route parameters, Form data | Call Model method, siapkan response |
| 4 | Model | Akses database, query, relasi data | Query parameters, filter | Eloquent Collection atau Model instance |
| 5 | Database | Eksekusi SQL query, return result set | SQL query (SELECT, INSERT, UPDATE, DELETE) | Result set dari tabel database |
| 6 | Model | Convert result ke PHP object/collection | Raw database result | Eloquent Model instance |
| 7 | Controller | Pass data ke view untuk rendering | Data dari model | View file dengan data |
| 8 | View (Blade) | Render HTML dengan data dinamis | Data dari controller | HTML string |
| 9 | Browser | Tampilkan HTML di layar user | HTTP Response (HTML) | Halaman web yang terlihat |
✨ Separation of Concerns: Setiap layer punya tanggung jawab tersendiri! Gampang dimaintain & scalable.
Wireframe animasi dari aplikasi yang akan kamu bangun:
"Sebagai admin toko online, saya ingin CRUD produk dengan mudah, upload gambar, dan organize produk by kategori agar customer bisa cari produk yang mereka mau."
✨ Kombinasi dari semua konsep ini yang membuat aplikasi web professional dan scalable!
Buatlah ERD untuk sistem perpustakaan sekolah dengan ketentuan:
💡 Hint: Satu member bisa pinjam banyak buku. Satu buku bisa dipinjam banyak member (tapi beda waktu)!
Buatlah migration dan seeder untuk sistem product-category di Laravel:
php artisan migrate --seed✨ Verified: Semua data muncul di database tanpa error!
Bangun aplikasi web LENGKAP dengan fitur:
🎊 Selesaikan project ini = kamu sudah mahir Database + Laravel! Siap untuk mini project atau internship! 🎊